//
//  NetworkManager.h
//  Soccer
//
//  Created by allm on 09. 06. 01.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "Match.h"
#import "TCPServer.h"
#import "BrowserViewController.h"
#import "Lobby.h"
#import "GameRoom.h"
#import "PASoundSource.h"

typedef enum NetworkMode
{
	ClientMode = 0,
	ServerMode = 1
} NetworkMode;

struct FrameHeader
{
	int				h_frame_id;				// 0: 서버의 아이디 발급
											// 1: 클라이언트의 접속&이름 보고 (쓸지 미정)
											// 2: [브로드] 서버에서 모든 유저에게 접속 상황을 알림 (1:1가정시 필요없음)
											// 3: 클라이언트의 레디보고 (1:1가정시 필요없을 듯)
											// 4: 서버의 시작 알림
											// 5: 골 이벤트 (서버 -> 클라이언트들)
											// 6: 슛! (클라이언트/서버 -> 서버)
											// 7: 스틸 (클라이언트/서버 -> 서버)
											// 8: 스킬 (클라이언트 -> 서버)
											// 9: 스킬 당했음을 알림(클라이언트/서버 -> 서버/클라이언트)
											// 10: 스킬을 사용했음을 알림(서버 -> 클라이언트)
											// 99: 게임내 Match 데이터
	int				h_send_id;
	int				h_recv_id;
	
	unsigned long	h_time;					//프레임을 보낼 때의 시간
	
	BOOL			h_continue;				// YES: 뒤에 데이터 프레임이 따라옴
											// NO: 뒤에 데이터 프레임이 따라오지 않음
};

// 플레이어 간의, 혹은 서버-클라이언트 간의 통신을 위한 데이터 프레임
struct FrameData
{
	int				d_frame_id;				// Frame의 종류를 명시하는 id; 
											// 0 = 초기 데이터(서버가 클라이언트에 id발급)
	int				d_frame_number;			
	
	int				d_send_id;				// 보내는 쪽(플레이어)의 id
	int				d_recv_id;				// 받는 쪽(플레이어)의 id
	
	int				d_ball_owner;			// 볼을 소유하고 있는 플레이어의 id
	int				d_ball_shooter;			// 볼을 찬 플레이어의 id
	float			d_ball_pos_x;			// 볼 위치의 x좌표
	float			d_ball_pos_y;			// 볼 위치의 y좌표
	float			d_ball_dir;				// 볼 방향
	NSTimeInterval	d_ball_shoot_time;		// 슛 시간
	BOOL			d_goal_in;				// 골인 발생 여부
	
	int				d_player0_id;			// Player0	
	float			d_player0_pos_x;			
	float			d_player0_pos_y;
	float			d_player0_dir;
	PlayerStatus	d_player0_status;
	
//	int				d_player1_id;			// Player1	
//	float			d_player1_pos_x;			
//	float			d_player1_pos_y;
//	float			d_player1_dir;
//	PlayerStatus	d_player1_status;
//	
//	int				d_player2_id;			// Player2	
//	float			d_player2_pos_x;			
//	float			d_player2_pos_y;
//	float			d_player2_dir;
//	PlayerStatus	d_player2_status;
//	
//	int				d_player3_id;			// Player3	
//	float			d_player3_pos_x;			
//	float			d_player3_pos_y;
//	float			d_player3_dir;
//	PlayerStatus	d_player3_status;
//	
//	int				d_player4_id;			// Player4	
//	float			d_player4_pos_x;			
//	float			d_player4_pos_y;
//	float			d_player4_dir;
//	PlayerStatus	d_player4_status;
//		
//	int				d_player5_id;			// Player5	
//	float			d_player5_pos_x;			
//	float			d_player5_pos_y;
//	float			d_player5_dir;
//	PlayerStatus	d_player5_status;
	
//	EventStatus		event;
};

/**
 NetworkManager
 */
@interface NetworkManager : NSObject <BrowserViewControllerDelegate, TCPServerDelegate> 
{
	// 서버 & 클라이언트 공통
	Lobby*				_lobby;
	GameRoom*			_gameRoom;
	TCPServer*			_server;
	NSTimer				*networkTimer;
	NSTimeInterval		networkInterval;
	
	BOOL				gameStarted;	
	NetworkMode			networkMode;
	int					frameNumber;
	int					preFrameNumber;

	
	// 서버
	BOOL				initialSetting;
	int					numberOfPlayer;
	NSMutableArray		*inputStreams;
	NSMutableArray		*outputStreams;
	
	
	// 클라이언트
	NSInputStream*		_inStream;
	NSOutputStream*		_outStream;
	BOOL				_inReady;
	BOOL				_outReady;

	int					myId;
	NSString			*myName;
	int					myTeam;
	
	// 필요없을 듯
	NSMutableArray		*inputReady;
	NSMutableArray		*outputReady;
	
	// Sound
	PASoundSource* shootSound;
	PASoundSource* stealSound;
	PASoundSource* stunSound;
}

+ (NetworkManager *)sharedNetworkManager;
- (void) networkSetting;
- (void) setup;
- (void) startGame;
- (void) goalHappened:(int)goal;
- (void) shootHappened;
- (void) stealHappened;
- (void) skillHappened;

//@property(readonly) Match *match;
@property (readwrite, assign) NSTimeInterval networkInterval;
@property NetworkMode networkMode;


@end
